package com.baidu.dsp.common.vo;

import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.NoSuchMessageException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import com.alibaba.fastjson.JSON;
import com.baidu.dsp.common.constant.ErrorCode;
import com.baidu.dsp.common.constant.FrontEndInterfaceConstant;
import com.baidu.dsp.common.context.ContextReader;

/**
 * 通用的JSON返回器
 *
 * @author liaoqiqi
 * @version 2013-12-3
 */
@Component
public class JsonObjectUtils {

	protected static final Logger LOG = LoggerFactory.getLogger(JsonObjectUtils.class);

	private static ContextReader contextReader;

	@Autowired(required = true)
	public JsonObjectUtils(@Qualifier("contextReaderImpl") ContextReader contextReader) {
		JsonObjectUtils.contextReader = contextReader;
	}

	/**
	 * 返回正确(多层结构), 非列表请求
	 *
	 * @param key
	 * @param value
	 *
	 * @return
	 */
	public static <T> JsonObjectBase buildObjectSuccess(String key, T value) {

		JsonObject json = new JsonObject();
		json.addData(key, value);

		LOG.info(JSON.toJSONString(json));

		return json;
	}

	/**
	 * 返回正确(顶层结构), 非列表请求
	 *
	 * @param value
	 *
	 * @return
	 */
	public static <T> JsonObjectBase buildSimpleObjectSuccess(T value) {

		JsonSimpleObject json = new JsonSimpleObject();
		json.setResult(value);

		LOG.info(json.toString());

		return json;
	}

	/**
	 * 返回正确, 列表请求
	 *
	 * @param value
	 *
	 * @return
	 */
	public static <T> JsonObjectBase buildListSuccess(List<?> value, int totalCount, T footResult) {

		JsonObjectList json = new JsonObjectList();

		json.setPage(totalCount);
		json.addData(value);
		json.addFootData(footResult);

		LOG.info(json.toString());

		return json;
	}

	/**
	 * 参数错误: Field
	 *
	 * @param errors
	 *
	 * @return
	 */
	public static JsonObjectBase buildFieldError(Map<String, String> errors, ErrorCode statusCode) {

		JsonObjectError json = new JsonObjectError();
		json.setStatus(statusCode.getCode());

		for (String str : errors.keySet()) {
			json.addFieldError(str, contextReader.getMessage(errors.get(str)));
		}

		LOG.info(json.toString());

		return json;
	}

	/**
	 * 参数错误: Field
	 *
	 * @param errors
	 *
	 * @return
	 */
	public static JsonObjectBase buildFieldError(Map<String, String> errors, Map<String, Object[]> argsMap, ErrorCode statusCode) {

		JsonObjectError json = new JsonObjectError();
		json.setStatus(statusCode.getCode());

		for (String str : errors.keySet()) {

			try {
				json.addFieldError(str, contextReader.getMessage(errors.get(str), argsMap.get(str)));
			} catch (NoSuchMessageException e) {
				json.addFieldError(str, errors.get(str));
			}
		}

		LOG.info(json.toString());

		return json;
	}

	/**
	 * 参数错误: global
	 */
	public static JsonObjectBase buildGlobalError(String error, ErrorCode errorCode) {

		JsonObjectError json = new JsonObjectError();
		json.setStatus(errorCode.getCode());

		json.addGlobalError(contextReader.getMessage(error));

		LOG.info(json.toString());

		return json;
	}

	/**
	 */
	public static ModelAndView JsonObjectError2ModelView(JsonObjectError json) {

		ModelAndView model = new ModelAndView(new MappingJackson2JsonView());
		model.addObject(FrontEndInterfaceConstant.RETURN_SUCCESS, json.getSuccess());
		model.addObject(FrontEndInterfaceConstant.RETURN_MESSAGE, json.getMessage());
		model.addObject(FrontEndInterfaceConstant.STATUS_CODE_STRING, json.getStatus());
		model.addObject(FrontEndInterfaceConstant.SESSION_ID, json.getSessionId());

		return model;
	}

	/**
	 * @param error
	 *
	 * @return
	 */
	public static String getMessage(String error) {
		return contextReader.getMessage(error);
	}
}
